package com.gn.test.test2;

import org.junit.Test;

import java.util.*;

/**
 * @version 1.0
 * @Author: 许啸林
 * @Date: 2022/1/24 17:11
 */
public class Gtest2 {
    /**
     * 泛型在继承方面的体现
     * A 是 B 的父类 G<A> 和 G<B>　不具有子父类关系
     * 补充  A<G> B<G>  A B 具有子父类关系
     */
    @Test
    public void T1() {
        Object o1 = null;
        String s1 = null;
        o1 = s1;
        List<String> ls1 = new ArrayList<>();
        List<Object> lo1 = new ArrayList<>();
        // 编译报错
        // lo1 = ls1;
    }

    @Test
    public void T2() {
        List<String> a = null;
        AbstractList a1 = null;
        ArrayList<String> b = null;
        a = b;
        a = a1;

    }

    /**
     * 泛型在继承方面的体现
     * 通配符 ?
     * A 是 B 的父类 G<A> 和 G<B>　不具有子父类关系 G<?> 是 G<A> 和 G<B>的公共父类
     *
     */
    @Test
    public void t3() {
        List<Object> l1 = null;
        List<String> l2 = new ArrayList<>();
        l2.add("123");
        l2.add("456");
        l2.add("789");
        List<?> l3 = null;
        l3 = l1;
        l3 = l2;
        Gtest2.each(l3);
        // 向list<?> 中添加(写入)数据,只能添加null
        //l3.add(new Object());
        //l3.add(null);

        // 获取(读取) 允许读取数据,读取的类型为Object
        Object o1 = l3.get(0);
        System.out.println("===============");
        System.out.println(o1);
    }

   public static void each(List<?> list) {
       Iterator<?> iterator = list.iterator();
       while (iterator.hasNext()) {
           Object next = iterator.next();
           System.out.println(next);
       }
   }

    /**
     * 有条件限制的通配符的使用
     *  ? extends A  G<? extends A> 其中  A 是 B 的父类, 可以作为 G<A> 和 G<B> 的父类
     *
     *  ? super A: G<? super A> 其中 B 是 A 的父类, 可以作为 G<A> 和 G<B> 的父类
     */
   @Test
   public void test4() {
        List<? extends Person> l1 = new ArrayList<>();
        List<? super Person> l2 = new ArrayList<>();

        List<Student> l3 = new ArrayList<>();
        List<Person> l4 = new ArrayList<>();
        List<Object> l5 = new ArrayList<>();

       //  l1 = l3;
       // l1 =l4;
        // 编译报错
        // l1 = l5;

       // 编译报错
       // l2 = l3;
      // l2 = l4;
      // l2 = l5;

       // 度数据  ? extends class 指向的对象必须是 class 的基类
       l1 = l3;
       Person person = l1.get(0);
       Object o = l1.get(0);
       // 报错
       //Student student = l1.get(0);

       l2 =l4;
       Object object = l2.get(0);
       // 编译报错
       // Person person1 = l2.get(0);


       // 写入
       l1 = l4;
       l2 = l4;

       //　编译报错
       //l1.add(new Student());
        l1.add(new Person());

       l2.add(new Person());
       l2.add(new Object());
   }
}
